/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * InternalFrame_AdminSist.java
 *
 * Created on 26-06-2009, 02:54:18 PM
 */
package vista.admin;

import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.dominio.Administrador;
import modelo.dominio.Credencial;
import modelo.dominio.Establecimiento;
import modelo.dominio.PlanGeneral;
import modelo.dominio.Usuario;
import modelo.tableModels.editors.Fecha_TableCellEditor;
import modelo.tableModels.editors.Objetivo_TableCellEditor;
import controlador.Selecter;
import vista.admin.listeners.PlanGeneral_ActionListener;
import vista.admin.listeners.Usuario_ActionListener;
import modelo.tableModels.renderers.listCells.Establecimiento_ListCellRender;
import modelo.tableModels.renderers.listCells.Fecha_ListCellRenderer;
import modelo.tableModels.renderers.tablecells.Establecimiento_TableCellRender;
import modelo.tableModels.renderers.listCells.Propietario_ListCellRender;
import modelo.tableModels.renderers.tablecells.Default_TableCellRenderer;
import modelo.tableModels.renderers.tablecells.Fecha_TableCellRender;
import modelo.tableModels.renderers.tablecells.Integer_TableCellRenderer;
import modelo.tableModels.renderers.tablecells.String_TableCellRenderer;
import modelo.tableModels.renderers.tablecells.Propietario_TableCellRender;
import modelo.tableModels.Planes_TableModel;
import modelo.tableModels.Usuario_TableModel;
import vista.extra.org.freixas.jcalendar.JCalendarCombo;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JPopupMenu.Separator;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import modelo.dal.fabricaDal.IFabricaDao;
import semillas_609_dev.Semillas_609_devApp;

/**
 *
 * @author Felipe
 */
public class InternalFrame_AdminSist extends javax.swing.JInternalFrame {

    private JCalendarCombo cbxFecha;
    private Planes_TableModel modeloPlanesGenerales;
    private Usuario_TableModel modeloUsuario;
    private PlanGeneral planGeneral;
    private Administrador administrador;
    private Usuario usuario;
    private Selecter querier;
    private JMenuItem itemNuevo;
    private JMenuItem itemClonar;
    private JMenuItem itemEliminar;

    /** Creates new form InternalFrame_AdminSist */
    public InternalFrame_AdminSist() {
        initComponents();
        modeloPlanesGenerales = new Planes_TableModel();
        modeloUsuario = new Usuario_TableModel();
        planGeneral = new PlanGeneral();
        administrador = new Administrador();
        usuario = new Usuario();
        querier = new Selecter(IFabricaDao.ORACLE);
    }

    @Override
    public void dispose() {
        JMenuItem item = (JMenuItem) Semillas_609_devApp.getApplication().getMainView().getMenuBar().getMenu(0).getItem(0).getSubElements()[0].getSubElements()[0];
        item.setEnabled(true);
        super.dispose();
    }

    public InternalFrame_AdminSist(JCalendarCombo cbxFecha, Planes_TableModel modeloPlanesGenerales, Usuario_TableModel modeloUsuario, PlanGeneral planGeneral, Administrador administrador, Usuario usuario, Selecter querier, JMenuItem itemNuevo, JMenuItem itemClonar, JMenuItem itemEliminar, JTree adminSistTree, JSeparator jSeparator1, JPanel panelAdminSist, JPopupMenu popTable, JPopupMenu popTree, JScrollPane scrTabla, JScrollPane scrpArbolDominio, JTable tabla) {
        this.cbxFecha = cbxFecha;
        this.modeloPlanesGenerales = modeloPlanesGenerales;
        this.modeloUsuario = modeloUsuario;
        this.planGeneral = planGeneral;
        this.administrador = administrador;
        this.usuario = usuario;
        this.querier = querier;
        this.itemNuevo = itemNuevo;
        this.itemClonar = itemClonar;
        this.itemEliminar = itemEliminar;
        this.adminSistTree = adminSistTree;
        this.jSeparator1 = jSeparator1;
        this.panelAdminSist = panelAdminSist;
        this.popTable = popTable;
        this.popTree = popTree;
        this.scrTabla = scrTabla;
        this.scrpArbolDominio = scrpArbolDominio;
        this.tabla = tabla;
    }

    /**
     *
     * carga un modelo con datos
     *
     * @param obj
     * Para cargar el modelo, el metodo necesita recibir un Objeto obj de Dominio para filtrar. Si recibe un objeto vacio cargara la tabla completa, por otra parte puede recibir un objeto de dominio parcialmente creado y cargara filtrando loas datos
     */
    private void cargarModelo(Object obj) throws InterruptedException {
        if (this.querier.daoExist == true) {
            if (obj instanceof PlanGeneral) {
                crearItemsPopTable((PlanGeneral) obj);
                getModeloPlanesGenerales().setData(querier.getLista((PlanGeneral) obj));
            }
            if (obj instanceof Usuario) {
                crearItemsPopTable((Usuario) obj);
                getModeloUsuario().setData(querier.getLista((Usuario) obj));
            }
        }
        if (this.querier.daoExist == false) {
            JOptionPane.showMessageDialog(null, "Motor de Datos no implementado");
        }
    }

    private void crearItemsPopTable(Object obj) {
        popTable.removeAll();
        itemNuevo = new JMenuItem("Nuevo");
        itemClonar = new JMenuItem("Clonar");
        itemEliminar = new JMenuItem("Eliminar");
        //TODO intentar poner esto en un solo listener
        if (obj instanceof PlanGeneral) {
            itemNuevo.addActionListener(new PlanGeneral_ActionListener((PlanGeneral) obj, PlanGeneral_ActionListener.INSERT));
        }
        if (obj instanceof Usuario) {
            itemNuevo.addActionListener(new Usuario_ActionListener((Usuario) obj, "insertar"));
        }

        popTable.add(itemClonar);
        popTable.add(itemEliminar);
        popTable.add(new Separator());
        popTable.add(itemNuevo);
    }

    private void crearTabla(String seleccion) throws InterruptedException {
        if (seleccion.equals("Usuarios")) {
            crearTablaUsuarios(seleccion);
        }
        if (seleccion.equals("Planes Generales")) {
            crearTablaPlanGeneral(seleccion);
        }
    }

    private void crearTablaPlanGeneral(String tituloBorde) throws InterruptedException {
        setModeloPlanesGenerales(this.modeloPlanesGenerales);
        tabla.setModel(getModeloPlanesGenerales());
        tabla.setDefaultRenderer(Object.class, new Default_TableCellRenderer());
        tabla.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        scrTabla.setBorder(new TitledBorder("Tabla de " + tituloBorde));

        TableColumn idColumna = tabla.getColumnModel().getColumn(Planes_TableModel.ID_INDEX);
        TableColumn titulColumna = tabla.getColumnModel().getColumn(Planes_TableModel.TITULO_INDEX);
        TableColumn objetColumna = tabla.getColumnModel().getColumn(Planes_TableModel.OBJETIVO_INDEX);
        TableColumn estabColumna = tabla.getColumnModel().getColumn(Planes_TableModel.ESTABLECIMIENTO_INDEX);
        TableColumn propiColumna = tabla.getColumnModel().getColumn(Planes_TableModel.PROPIETARIO_INDEX);
        TableColumn fechaColumna = tabla.getColumnModel().getColumn(Planes_TableModel.FECHA_INDEX);

        JComboBox cbxEstablecimiento = new JComboBox();
        cbxEstablecimiento.addItem(new Establecimiento("Las Semillitas"));
        cbxEstablecimiento.addItem(new Establecimiento("Escuela Chile"));

        JComboBox cbxPropietario = new JComboBox();
        cbxPropietario.addItem(new Credencial("Administrador"));
        cbxPropietario.addItem(new Credencial("c.hernandez@semillitas"));
        cbxPropietario.addItem(new Credencial("c.hernandez@escuelachile"));
        cbxPropietario.addItem(new Credencial("f.madariaga@semillitas"));

        //JComboBox calendario = new JComboBox();
        this.cbxFecha = new JCalendarCombo();
        //calendario.addItem(this.cbxFecha);

        objetColumna.setCellEditor(new Objetivo_TableCellEditor());
        propiColumna.setCellEditor(new DefaultCellEditor(cbxPropietario));
        estabColumna.setCellEditor(new DefaultCellEditor(cbxEstablecimiento));
        fechaColumna.setCellEditor(new Fecha_TableCellEditor(cbxFecha));

        idColumna.setCellRenderer(new Integer_TableCellRenderer());
        titulColumna.setCellRenderer(new String_TableCellRenderer());
        objetColumna.setCellRenderer(new String_TableCellRenderer());
        estabColumna.setCellRenderer(new Establecimiento_TableCellRender());
        propiColumna.setCellRenderer(new Propietario_TableCellRender());
        fechaColumna.setCellRenderer(new Fecha_TableCellRender());


        cbxEstablecimiento.setRenderer(new Establecimiento_ListCellRender());
        cbxPropietario.setRenderer(new Propietario_ListCellRender());
        cbxFecha.setRenderer(new Fecha_ListCellRenderer());
        cargarModelo(new PlanGeneral());//un Plan vacio carga toda la lista de Planes Generales;
    }

    private void crearTablaUsuarios(String tituloBorde) throws InterruptedException {
        setModeloUsuario(this.modeloUsuario);
        tabla.setModel(getModeloUsuario());
        tabla.setDefaultRenderer(Object.class, new Default_TableCellRenderer());
        scrTabla.setBorder(new TitledBorder("Tabla de " + tituloBorde));

        TableColumn idColumna = tabla.getColumnModel().getColumn(Usuario_TableModel.ID_INDEX);
        TableColumn nom1Columna = tabla.getColumnModel().getColumn(Usuario_TableModel.NOMBRE1_INDEX);
        TableColumn nom2Columna = tabla.getColumnModel().getColumn(Usuario_TableModel.NOMBRE2_INDEX);
        TableColumn ape1Columna = tabla.getColumnModel().getColumn(Usuario_TableModel.APELLIDOPAT_INDEX);
        TableColumn ape2Columna = tabla.getColumnModel().getColumn(Usuario_TableModel.APELLIDOMAT_INDEX);
        TableColumn tipoColumna = tabla.getColumnModel().getColumn(Usuario_TableModel.TIPO_INDEX);

        idColumna.setCellRenderer(new Integer_TableCellRenderer());
        nom1Columna.setCellRenderer(new String_TableCellRenderer());
        nom2Columna.setCellRenderer(new String_TableCellRenderer());
        ape1Columna.setCellRenderer(new String_TableCellRenderer());
        ape2Columna.setCellRenderer(new String_TableCellRenderer());
        tipoColumna.setCellRenderer(new String_TableCellRenderer());

        cargarModelo(this.usuario);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        popTable = new javax.swing.JPopupMenu();
        popTree = new javax.swing.JPopupMenu();
        panelAdminSist = new javax.swing.JPanel();
        scrpArbolDominio = new javax.swing.JScrollPane();
        adminSistTree = new javax.swing.JTree();
        scrTabla = new javax.swing.JScrollPane();
        tabla = new javax.swing.JTable();
        jSeparator1 = new javax.swing.JSeparator();

        popTable.setName("popTable"); // NOI18N

        popTree.setName("popTree"); // NOI18N

        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setResizable(true);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(semillas_609_dev.Semillas_609_devApp.class).getContext().getResourceMap(InternalFrame_AdminSist.class);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setMaximumSize(new java.awt.Dimension(404, 317));
        setName("Form"); // NOI18N

        panelAdminSist.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelAdminSist.border.title"))); // NOI18N
        panelAdminSist.setAutoscrolls(true);
        panelAdminSist.setName("panelAdminSist"); // NOI18N

        scrpArbolDominio.setName("scrpArbolDominio"); // NOI18N

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Árbol de dominio");
        javax.swing.tree.DefaultMutableTreeNode treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Usuarios");
        javax.swing.tree.DefaultMutableTreeNode treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Administradores de Sistema");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Administradores de Planificaciones");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Ayudantes");
        treeNode2.add(treeNode3);
        treeNode1.add(treeNode2);
        treeNode2 = new javax.swing.tree.DefaultMutableTreeNode("Planes");
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planes Generales");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planes Semestrales");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planes Mensuales");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planes Semanales");
        treeNode2.add(treeNode3);
        treeNode3 = new javax.swing.tree.DefaultMutableTreeNode("Planes Diarios");
        treeNode2.add(treeNode3);
        treeNode1.add(treeNode2);
        adminSistTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        adminSistTree.setComponentPopupMenu(popTree);
        adminSistTree.setName("adminSistTree"); // NOI18N
        adminSistTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                adminSistTreeValueChanged(evt);
            }
        });
        scrpArbolDominio.setViewportView(adminSistTree);

        scrTabla.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        scrTabla.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrTabla.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrTabla.setName("scrTabla"); // NOI18N
        scrTabla.setOpaque(false);

        tabla.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        tabla.setComponentPopupMenu(popTable);
        tabla.setDebugGraphicsOptions(javax.swing.DebugGraphics.BUFFERED_OPTION);
        tabla.setName("tabla"); // NOI18N
        scrTabla.setViewportView(tabla);

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jSeparator1.setAutoscrolls(true);
        jSeparator1.setName("jSeparator1"); // NOI18N

        javax.swing.GroupLayout panelAdminSistLayout = new javax.swing.GroupLayout(panelAdminSist);
        panelAdminSist.setLayout(panelAdminSistLayout);
        panelAdminSistLayout.setHorizontalGroup(
            panelAdminSistLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAdminSistLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(scrpArbolDominio, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
                .addGap(26, 26, 26)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(scrTabla, javax.swing.GroupLayout.DEFAULT_SIZE, 591, Short.MAX_VALUE)
                .addContainerGap())
        );
        panelAdminSistLayout.setVerticalGroup(
            panelAdminSistLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelAdminSistLayout.createSequentialGroup()
                .addGroup(panelAdminSistLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(scrTabla, javax.swing.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE)
                    .addComponent(scrpArbolDominio, javax.swing.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelAdminSist, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelAdminSist, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void adminSistTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_adminSistTreeValueChanged
        String seleccion = (String) evt.getNewLeadSelectionPath().getLastPathComponent().toString();
        if ((seleccion.equals("Usuarios")) || (seleccion.equals("Planes Generales"))) {
            try {
                crearTabla(seleccion);
            } catch (InterruptedException ex) {
                Logger.getLogger(InternalFrame_AdminSist.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            DefaultTableModel modeloDefaultTabla = new DefaultTableModel();
            tabla.setModel(modeloDefaultTabla);
            scrTabla.setBorder(new TitledBorder(""));
        }
    }//GEN-LAST:event_adminSistTreeValueChanged
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTree adminSistTree;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JPanel panelAdminSist;
    private javax.swing.JPopupMenu popTable;
    private javax.swing.JPopupMenu popTree;
    private javax.swing.JScrollPane scrTabla;
    private javax.swing.JScrollPane scrpArbolDominio;
    public javax.swing.JTable tabla;
    // End of variables declaration//GEN-END:variables

    /**
     * @return the modeloPlanesGenerales
     */
    public Planes_TableModel getModeloPlanesGenerales() {
        return modeloPlanesGenerales;
    }

    /**
     * @param modeloPlanesGenerales the modeloPlanesGenerales to set
     */
    public void setModeloPlanesGenerales(Planes_TableModel modeloPlanesGenerales) {
        this.modeloPlanesGenerales = modeloPlanesGenerales;
    }

    /**
     * @return the planGeneralDefault
     */
    public PlanGeneral getPlanGeneralDefault() {
        return planGeneral;
    }

    /**
     * @param planGeneralDefault the planGeneralDefault to set
     */
    public void setPlanGeneralDefault(PlanGeneral planGeneral) {
        this.planGeneral = planGeneral;
    }

    /**
     * @return the modeloUsuario
     */
    public Usuario_TableModel getModeloUsuario() {
        return modeloUsuario;
    }

    /**
     * @param modeloUsuario the modeloUsuario to set
     */
    public void setModeloUsuario(Usuario_TableModel modeloUsuario) {
        this.modeloUsuario = modeloUsuario;
    }
}
